//package com.mallcloud.mall.common.data.mybatis;
//
//import cn.hutool.core.util.*;
//import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
//import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
//import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
//import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
//import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
//import lombok.SneakyThrows;
//import lombok.extern.slf4j.Slf4j;
//import org.apache.ibatis.executor.Executor;
//import org.apache.ibatis.mapping.MappedStatement;
//import org.apache.ibatis.plugin.Interceptor;
//import org.apache.ibatis.plugin.Intercepts;
//import org.apache.ibatis.plugin.Invocation;
//import org.apache.ibatis.plugin.Signature;
//import org.apache.ibatis.session.ResultHandler;
//import org.apache.ibatis.session.RowBounds;
//import org.springframework.beans.BeanUtils;
//
//import java.lang.reflect.Method;
//import java.nio.charset.Charset;
//import java.util.ArrayList;
//import java.util.List;
//import java.util.Map;
//import java.util.regex.Matcher;
//import java.util.regex.Pattern;
//import java.util.stream.Collectors;
//
///**
// * Oracle ISO-8859-1本地UTF-8 数据库字符转换
// */
//@Slf4j
//@Intercepts({
//		@Signature(type = Executor.class, method = "query", args = {MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class}),
//		@Signature(type = Executor.class, method = "update", args = {MappedStatement.class, Object.class})
//})
//public class CharacterEncodingInterceptor implements Interceptor {
//
//	private ToOracleProperties toOracleProperties;
//
//	/**
//	 * Bean方法名中属性名开始的下标
//	 */
//	private static final int BEAN_METHOD_PROP_INDEX = 3;
//	/**
//	 * 匹配getter方法的正则表达式
//	 */
//	private static final Pattern GET_PATTERN = Pattern.compile("get(\\p{javaUpperCase}\\w*)");
//	/**
//	 * 匹配setter方法的正则表达式
//	 */
//	private static final Pattern SET_PATTERN = Pattern.compile("set(\\p{javaUpperCase}\\w*)");
//	/**
//	 * 中文
//	 */
//	private static final Pattern CHINESE_PATTERN = Pattern.compile("[\u4E00-\u9FA5|\\！|\\，|\\。|\\（|\\）|\\《|\\》|\\“|\\”|\\？|\\：|\\；|\\【|\\】]");
//	private static final Pattern p = Pattern.compile("\\s*|t*|r*|n*");
//
//	@Override
//	public Object intercept(Invocation invocation) throws Throwable {
////		if (invocation.getTarget() instanceof Executor) {
////			Object[] args = invocation.getArgs();
////			Optional.of(args[1]).ifPresent(o -> args[1] = write(o, true));
////		}
//		// 继续执行
//		Object o = invocation.proceed();
//		log.debug("解析对象");// 如果栈溢出，可以看到原因
//		return write(o, false);
//	}
//
//	public CharacterEncodingInterceptor(ToOracleProperties toOracleProperties) {
//		this.toOracleProperties = toOracleProperties;
//	}
//
//	@SneakyThrows
//	private Object write(Object o, boolean toOracle) {
//		if (o == null) {
//		}
//		else if (o instanceof String) {
//			if (toOracle) {
//				if (isChinese(o.toString())) {
//					o = CharsetUtil.convert(o.toString(), toOracleProperties.getLocal(), toOracleProperties.getOracle());
//				}
//			}
//			else {
//				if (isMessyCode(o.toString())) {
//					o = CharsetUtil.convert(o.toString(), toOracleProperties.getOracle(), toOracleProperties.getLocal());
//				}
//			}
//		}
//		else if (o instanceof Map) {
//			o = ((Map<String, ?>) o).entrySet().stream().collect(Collectors.toMap(Map.Entry::getKey, v -> write(v.getValue(), toOracle)));
//		}
//		else if (o instanceof List) {
//			o = ((List) o).stream().map(o1 -> write(o1, toOracle)).collect(Collectors.toList());
//		}
////		else if (o instanceof Object[]) {
////			Object[] temp = new Object[((Object[]) o).length];
////			for (int i = 0; i < ((Object[]) o).length; i++) {
////				temp[i] = write(((Object[]) o)[i], toOracle);
////			}
////			return temp;
////		}
//		else if (o instanceof Page) {
//		}
//		else if (o instanceof LambdaQueryWrapper) {
//			LambdaQueryWrapper x = (LambdaQueryWrapper) o;
//			if (x.isEmptyOfEntity()) {
//				return x;
//			}
//			x.setEntity(write(x.getEntity(), toOracle));
//			return x;
//		}
//		else if (o instanceof QueryWrapper) {
//			QueryWrapper x = (QueryWrapper) o;
//			if (x.isEmptyOfEntity()) {
//				return x;
//			}
//			x.setEntity(write(x.getEntity(), toOracle));
//			return x;
//		}
//		else if (o instanceof LambdaUpdateWrapper) {
//			LambdaUpdateWrapper x = (LambdaUpdateWrapper) o;
//			if (x.isEmptyOfEntity()) {
//				return x;
//			}
//			x.setEntity(write(x.getEntity(), toOracle));
//			return x;
//		}
//		else if (o instanceof UpdateWrapper) {
//			UpdateWrapper x = (UpdateWrapper) o;
//			if (x.isEmptyOfEntity()) {
//				return x;
//			}
//			x.setEntity(write(x.getEntity(), toOracle));
//			return x;
//		}
//		//不是简单类型 原语、字符串或其他字符序列、数字、日期、URI、URL、区域设置或类
//		else if (BeanUtils.isSimpleValueType(o.getClass())) {
//		}
//		else if (BooleanUtil.isBoolean(o.getClass())) {
//		}
//		else if (NumberUtil.isDouble(o.toString())) {
//		}
//		else if (NumberUtil.isLong(o.toString())) {
//		}
//		else {
//			//普通class类型
//			tranfBeanProp(o, toOracle);
//		}
//		return o;
//	}
//
//	/**
//	 * 获取对象的setter方法。
//	 *
//	 * @param obj 对象
//	 * @return 对象的setter方法列表
//	 */
//	private List<Method> getSetterMethods(Object obj) {
//		// setter方法列表
//		List<Method> setterMethods = new ArrayList<>();
//
//		// 获取所有方法
//		Method[] methods = obj.getClass().getMethods();
//
//		// 查找setter方法
//		for (Method method : methods) {
//			Matcher m = SET_PATTERN.matcher(method.getName());
//			if (m.matches() && (method.getParameterTypes().length == 1)) {
//				setterMethods.add(method);
//			}
//		}
//		// 返回setter方法列表
//		return setterMethods;
//	}
//
//	/**
//	 * 获取对象的getter方法。
//	 *
//	 * @param obj 对象
//	 * @return 对象的getter方法列表
//	 */
//	private List<Method> getGetterMethods(Object obj) {
//		// getter方法列表
//		List<Method> getterMethods = new ArrayList<>();
//		// 获取所有方法
//		Method[] methods = obj.getClass().getMethods();
//		// 查找getter方法
//		for (Method method : methods) {
//			Matcher m = GET_PATTERN.matcher(method.getName());
//			if (m.matches() && (method.getParameterTypes().length == 0)) {
//				getterMethods.add(method);
//			}
//		}
//		// 返回getter方法列表
//		return getterMethods;
//	}
//
//	/**
//	 * 检查Bean方法名中的属性名是否相等。<br>
//	 * 如getName()和setName()属性名一样，getStoreName()和setAge()属性名不一样。
//	 *
//	 * @param m1 方法名1
//	 * @param m2 方法名2
//	 * @return 属性名一样返回true，否则返回false
//	 */
//	private boolean isMethodPropEquals(String m1, String m2) {
//		return m1.substring(BEAN_METHOD_PROP_INDEX).equals(m2.substring(BEAN_METHOD_PROP_INDEX));
//	}
//
//	/**
//	 * Bean属性复制工具方法。
//	 *
//	 * @param src 目标对象
//	 */
//	private void tranfBeanProp(Object src, Boolean toOracle) {
//		List<Method> destSetters = getSetterMethods(src);
//		List<Method> srcGetters = getGetterMethods(src);
//		try {
//			for (Method setter : destSetters) {
//				for (Method getter : srcGetters) {
//					if (isMethodPropEquals(setter.getName(), getter.getName()) && setter.getParameterTypes()[0].equals(getter.getReturnType())) {
//						Object o = getter.invoke(src);
//						if (ObjectUtil.isNull(o)) {
//							continue;
//						}
//						log.debug("解析对象");// 如果栈溢出，可以看到原因
//						setter.invoke(src, writeReflect(o, toOracle));
//					}
//				}
//			}
//		}
//		catch (Exception e) {
//			log.error("tranfBeanProp " + src.getClass().getName(), e);
//		}
//	}
//
//	private Object writeReflect(Object o, boolean toOracle) {
//		if (o instanceof String) {
//			if (toOracle) {
//				if (isChinese(o.toString())) {
//					o = CharsetUtil.convert(o.toString(), toOracleProperties.getLocal(), toOracleProperties.getOracle());
//				}
//			}
//			else {
//				if (isMessyCode(o.toString())) {
//					o = CharsetUtil.convert(o.toString(), toOracleProperties.getOracle(), toOracleProperties.getLocal());
//				}
//			}
//		}
//		else if (o instanceof Map) {
//			o = ((Map<String, ?>) o).entrySet().stream().collect(Collectors.toMap(Map.Entry::getKey, v -> write(v.getValue(), toOracle)));
//		}
//		else if (o instanceof List) {
//			o = ((List) o).stream().map(o1 -> write(o1, toOracle)).collect(Collectors.toList());
//		}
////		else if (o instanceof Object[]) {
////			Object[] temp = new Object[((Object[]) o).length];
////			for (int i = 0; i < ((Object[]) o).length; i++) {
////				temp[i] = write(((Object[]) o)[i], toOracle);
////			}
////			return temp;
////		}
//		return o;
//	}
//
//	private boolean isMessyCode(String s) {
//		if (!Charset.forName(CharsetUtil.GBK).newEncoder().canEncode(s)) {
//			return true;
//		}
//		Matcher m = p.matcher(s);
//		String after = m.replaceAll("");
//		String temp = after.replaceAll("\\p{P}", "");
//		char[] ch = temp.trim().toCharArray();
//		float chLength = ch.length;
//		float count = 0;
//		for (int i = 0; i < ch.length; i++) {
//			char c = ch[i];
//			if (!Character.isLetterOrDigit(c)) {
//				if (!isChinese(c)) {
//					count = count + 1;
//				}
//			}
//		}
//		float result = count / chLength;
//		if (result > 0.4) {
//			return true;
//		}
//		else {
//			return false;
//		}
//	}
//
//	private boolean isChinese(char c) {
//		Character.UnicodeBlock ub = Character.UnicodeBlock.of(c);
//		if (ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS
//				|| ub == Character.UnicodeBlock.CJK_COMPATIBILITY_IDEOGRAPHS
//				|| ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS_EXTENSION_A
//				|| ub == Character.UnicodeBlock.GENERAL_PUNCTUATION
//				|| ub == Character.UnicodeBlock.CJK_SYMBOLS_AND_PUNCTUATION
//				|| ub == Character.UnicodeBlock.HALFWIDTH_AND_FULLWIDTH_FORMS) {
//			return true;
//		}
//		return false;
//	}
//
//	private boolean isChinese(String s) {
//		if (StrUtil.isBlank(s)) {
//			return false;
//		}
//		Matcher m = CHINESE_PATTERN.matcher(s);
//		if (m.find()) {
//			return true;
//		}
//		return false;
//	}
//}
